package main

import (
	"context"
	"sync"
	"time"
	"yundian/internel/app/helper"
	"yundian/internel/app/logic"
	. "yundian/internel/pkg/dbs"
	. "yundian/internel/pkg/dingo"
	"yundian/internel/pkg/dingo/global"
	"yundian/internel/pkg/dingo/system"
	"yundian/internel/pkg/wechatpay"
)

// ------------------ 数据统计相关定时任务 ------------------------------- //

func main() {
	TaskSystem := system.New("./configs/adm.yaml").
		Ready(
			NewZapComponent(),   // logger 日志管理
			NewMysqlComponent(), // mysql 连接
			NewRedisComponent(), // redis 连接
			NewTransComponent(), // validator 翻译器
		)

	// --------------------------- 基础数据分析 --------------------------- //

	// 每天 05:07分 基础订单数据分析
	TaskSystem.Task("0 07 05 * * *", func() {
		var dateList []string
		dateStr := time.Now().AddDate(0, 0, -1).Format("2006-01-02")
		dateList = append(dateList, dateStr)
		logic.NewTaskStatisticsLogic().StatisticsByDateStr(dateList) // 中曼整体数据
		n := time.Now()
		d := time.Date(n.Year(), n.Month(), n.Day(), 07, 07, 0, 0, wechatpay.BeijingLocation).Format("2006-01-02 15:04:05")
		global.Rdb.Set(context.Background(), "statistics_update_time", d, time.Hour*24) // 记录更新时间
	})

	// 每天 15:07分 基础订单数据分析(最近10天)
	TaskSystem.Task("0 07 16 * * *", func() {
		now := time.Now()
		startDay := now.AddDate(0, 0, -11).Format("2006-01-02")
		endDay := now.AddDate(0, 0, -2).Format("2006-01-02")
		days := helper.GetDayRangeTime(startDay, endDay)
		logic.NewTaskStatisticsLogic().StatisticsByDateStr(days)
		n := time.Now()
		d := time.Date(n.Year(), n.Month(), n.Day(), 15, 07, 0, 0, wechatpay.BeijingLocation).Format("2006-01-02 15:04:05")
		global.Rdb.Set(context.Background(), "statistics_update_time", d, time.Hour*24) // 记录更新时间
	})


	// --------------------------- 用户数据统计 --------------------------- //

	// 每天 08:07 动销用户数据分析(T-1)
	TaskSystem.Task("0 07 06 * * *", func() {
		var dateList []string
		dateStr := time.Now().AddDate(0, 0, -1).Format("2006-01-02")
		dateList = append(dateList, dateStr)
		logic.NewTaskStatisticsUserLogic().StatisticsByTypeByHaveOrders(dateList) // 动销
	})

	// 每天 07:07 未动销用户数据分析(T-1)
	TaskSystem.Task("0 07 07 * * *", func() {
		dateStr := time.Now().AddDate(0, 0, -1).Format("2006-01-02")
		logic.NewTaskStatisticsUserLogic().StatisticsByTypeByNoHaveOrders(dateStr) // 未动销用户
	})


	// --------------------------- 月份订单缓存表生成 --------------------------- //

	// 订单缓存表 8点00分 - 上月(用于门店列表查看-参考不用于财务计算)
	TaskSystem.Task("0 0 08 * * *", func() {
		beginTime, endTime := wechatpay.GetLastMonthStartEnd()
		t := wechatpay.StrJoin("orders_", time.Now().AddDate(0, -1, 0).Format("2006_01"))
		logic.NewTaskLogic().GetOrderCacheByMonth(beginTime, endTime, t)
	})

	// 订单缓存表 (9:00、11:00、14:00、17:00、19:00) - 当月(用于门店列表查看-参考不用于财务计算)
	TaskSystem.Task("0 0 09,11,14,17,19 * * *", func() {
		beginTime, endTime := wechatpay.GetNowMonthStartEnd()
		t := wechatpay.StrJoin("orders_", time.Now().Format("2006_01"))
		logic.NewTaskLogic().GetOrderCacheByMonth(beginTime, endTime, t)
	})


	// --------------------------- 用户数据统计 --------------------------- //

	// 每天 10:07 用户数据分析
	TaskSystem.Task("0 07 10 * * *", func() {
		now := time.Now()
		startDay := now.AddDate(0, 0, -9).Format("2006-01-02")
		endDay := now.AddDate(0, 0, -6).Format("2006-01-02")
		days := helper.GetDayRangeTime(startDay, endDay)

		maxGoroutine := 4 // 开启协程的大小
		var pool chan struct{}
		pool = make(chan struct{}, maxGoroutine) // 协程池
		var wg sync.WaitGroup

		for _, d := range days {
			wg.Add(1)
			pool <- struct{}{}
			go func() {
				defer wg.Done()
				defer func() {
					<- pool
				}()
				var dateList []string
				dateList = append(dateList, d)
				logic.NewTaskStatisticsUserLogic().StatisticsByTypeByHaveOrders(dateList)
			}()
		}

		wg.Wait()

	})

	// 每天 15:07 用户数据分析
	TaskSystem.Task("0 07 15 * * *", func() {
		now := time.Now()
		startDay := now.AddDate(0, 0, -5).Format("2006-01-02")
		endDay := now.AddDate(0, 0, -2).Format("2006-01-02")
		days := helper.GetDayRangeTime(startDay, endDay)

		maxGoroutine := 4 // 开启协程的大小
		var pool chan struct{}
		pool = make(chan struct{}, maxGoroutine) // 协程池
		var wg sync.WaitGroup

		for _, d := range days {
			wg.Add(1)
			pool <- struct{}{}
			go func() {
				defer wg.Done()
				defer func() {
					<- pool
				}()
				var dateList []string
				dateList = append(dateList, d)
				logic.NewTaskStatisticsUserLogic().StatisticsByTypeByHaveOrders(dateList)
			}()
		}

		wg.Wait()

	})


	// 网点用户统计
	TaskSystem.Task("0 30 06,18 * * *", func() {
		logic.NewTaskLogic().TaskLogicPlaceIncomeStatistics(2, "pcl")
	})


	TaskSystem.Go()
}
